package jdx_03_沉睡$让步$加入;


import jdx_00_utils.JdxUtils;

public class SleepYield {
    //当前线程一旦沉睡，那么其他的线程就有了执行的机会
    public static void test_01(){
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println("沉睡"+i);
                JdxUtils.sleep(500);//在这个500毫秒之内，其他的线程有了执行的机会
            }
        }).start();
        new Thread(()->{
            for (int i = 0; i < 1000; i++) {
                System.out.println("我有了执行的机会"+i);//在上面线程沉睡的时候，我可以执行
                JdxUtils.sleep(100);
            }
        }).start();

    }

    public static void test_02(){
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println("T1 : 我正在运行...");
                if (i%10==0){
                    System.out.println("T1 : 我先去趟厕所...");
                    Thread.yield();//此时的线程先退出一段时间
                }
            }
        }).start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println("T2:22222");
                if (i%10==0){
                    System.out.println("T2:====");
                    Thread.yield();//此时的线程先退出一段时间
                }
            }
        }).start();

        /*
        (1).yield()其实就是让出一下cpu资源，让步的线程会回到等待队列中，
        (2).cpu也有可能直接把刚刚让步的线程再次调用起来
        (3).但是很大的概率是优先执行等待队列中其他的线程
        (4).在线程让步的过程中，其他的线程也有机会来执行
         */


    }

    public static void test_03() {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println("111111111");
                JdxUtils.sleep(200);
            }
            System.out.println("T1执行完毕");
        });

        Thread t2 = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                if (i==5){
                    try {
                        System.out.println("T1 加入了执行 ======= 优先执行完T1之后再执行T2  =======");
                        t1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("222222222");
                JdxUtils.sleep(200);
            }
            System.out.println("T2执行完毕");
        });
        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
//        test_01();//沉睡
//        test_02();//让步
        test_03();//加入
    }
    /*
    join加入:可以使得线程按顺序执行
     */
}
